서울시 치안데이터 분석

“CCTV가 많으면 범죄수를
낮추는 데에 도움이 될까요?”

출처: 서울시 공공데이터포털 (https://data.seoul.go.kr/)

데이터 살펴보기
<<<<<<< HEAD
======= <<<<<<< HEAD
TOP 3
    자치구       총생활인구수
16  송파구  753278.4966
0   강남구  633521.1274
3   강서구  533814.0426
<<<<<<< HEAD
======= <<<<<<< HEAD
TOP 3
    자치구   1인가구수
4   관악구  150745
3   강서구  104509
16  송파구   87140

데이터 살펴보기
<<<<<<< HEAD
======= <<<<<<< HEAD
자치구
강남구    7007
관악구    5366
서초구    5060
Name: count, dtype: int64
<<<<<<< HEAD
======= <<<<<<< HEAD
자치구
강남구    1713
용산구    1421
구로구    1372
Name: count, dtype: int64
<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5

안전벨과 CCTV의 상관관계: 0.3032
예상과 달리, CCTV와 안전벨의 상관관계가 높지 않다.

데이터 살펴보기
<<<<<<< HEAD
======= <<<<<<< HEAD
<<<<<<< HEAD
======= <<<<<<< HEAD
<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5

<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5

치안센터와 경찰관 수의 상관관계: 0.6500
다른 변수들과 비교했을 때 가장 높은 상관관계를 보임
종로구와 강남구만 조금 다르고 나머지는 비슷하다.

데이터 살펴보기
<<<<<<< HEAD
======= <<<<<<< HEAD
    자치구   술집 수
0   강남구  12700
11  마포구   8258
16  송파구   7348
<<<<<<< HEAD
======= <<<<<<< HEAD
    자치구  총범죄건수
0   강남구  16244
16  송파구  10976
13  서초구  10458
<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5

술집 수와 총 범죄 건수의 상관계수: 0.8354
다른 변수들과 비교했을 때, 가장 높은 상관관계를 보임

상관계수 분석

<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5

범죄건수 주요 변수

  • 구별 경찰 수
  • 술집 수
  • 생활 인구 수
  • CCTV 총 수량
  • 1인가구수

회귀분석
<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5

상관 관계 높은 변수 임의 선택

VS Stepwise로 변수 선택

회귀분석

변수 전처리

<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
df2 = df.copy()

scaler = StandardScaler()
x = ['총생활인구수', '총범죄건수', '구별 경찰수', 
    '안전벨 개수', 'CCTV 수량', '총 음식점 수', 
    '1인가구수', '파출소수']
X_scaled = scaler.fit_transform(df2[x])

X_scaled_df = pd.DataFrame(X_scaled, columns=x, index=df2.index)
  • 변수의 Scale 이 각각 다르기 때문에, 표준화 수행
  • 변수간 영향을 공정하게 비교하자

회귀분석(상관관계 기준)
<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
X3 = X_scaled_df[['총 음식점 수','CCTV 수량','1인가구수','구별 경찰수','총생활인구수']]
y = X_scaled_df['총범죄건수']
X3 = sm.add_constant(X3)
model3 = sm.OLS(y, X3).fit()
print(model3.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  총범죄건수   R-squared:                       0.903
Model:                            OLS   Adj. R-squared:                  0.876
Method:                 Least Squares   F-statistic:                     33.57
Date:                Fri, 18 Apr 2025   Prob (F-statistic):           1.61e-08
<<<<<<< HEAD
Time:                        08:17:14   Log-Likelihood:                -6.0400
=======
<<<<<<< HEAD
Time:                        01:19:30   Log-Likelihood:                -6.0400
=======
Time:                        01:30:14   Log-Likelihood:                -6.0400
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d
>>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
No. Observations:                  24   AIC:                             24.08
Df Residuals:                      18   BIC:                             31.15
Df Model:                           5                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const        1.11e-16      0.073   1.51e-15      1.000      -0.154       0.154
총 음식점 수        0.4745      0.166      2.865      0.010       0.127       0.822
CCTV 수량        0.1789      0.097      1.840      0.082      -0.025       0.383
1인가구수          0.0846      0.098      0.866      0.398      -0.121       0.290
구별 경찰수         0.1832      0.186      0.986      0.337      -0.207       0.574
총생활인구수         0.2817      0.108      2.611      0.018       0.055       0.508
==============================================================================
Omnibus:                        0.922   Durbin-Watson:                   2.122
Prob(Omnibus):                  0.631   Jarque-Bera (JB):                0.287
Skew:                          -0.258   Prob(JB):                        0.867
Kurtosis:                       3.144   Cond. No.                         5.62
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

<<<<<<< HEAD 회귀분석(Stepwise)

이번엔 Stepwise방식으로 회귀 분석을 진행해보겠습니다.

  1. AIC 기준
  2. Adj.R2 기준
======= <<<<<<< HEAD 회귀분석(상관관계 기준)

회귀분석(Stepwise: AIC)
======= 회귀분석(Stepwise: AIC)
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d
X1 = X_scaled_df[['총생활인구수', '구별 경찰수','안전벨 개수' ,'CCTV 수량', '총 음식점 수', '1인가구수','파출소수']]
y = X_scaled_df['총범죄건수']

lr = LinearRegression()
names = X1.columns
def aic_score(estimator,X1, y):
    X1 = sm.add_constant(X1) 
    model = sm.OLS(y, X1).fit()
    return -model.aic

# Perform SFS
sfs = SFS(lr,
          k_features=(1,7),   
          forward=True,      
          scoring=aic_score,  
          cv=0)
sfs.fit(X1, y)

print('선택된 features:', np.array(names)[list(sfs.k_feature_idx_)])
print("상관계수 feature: ['총 음식점 수','CCTV 수량','1인가구수','구별 경찰수','총생활인구수']")
선택된 features: ['총생활인구수' '구별 경찰수' 'CCTV 수량' '총 음식점 수' '파출소수']
상관계수 feature: ['총 음식점 수','CCTV 수량','1인가구수','구별 경찰수','총생활인구수']
  • 상관계수 기준으로 선택한 변수와 80% 일치합니다.
>>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5

회귀분석(비교)
<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d
x1 = X_scaled_df[['총생활인구수', '구별 경찰수', 'CCTV 수량', '총 음식점 수', '파출소수']]
x1 = sm.add_constant(x1)
model1 = sm.OLS(y, x1).fit()
print(model1.summary())
>>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  총범죄건수   R-squared:                       0.925
Model:                            OLS   Adj. R-squared:                  0.904
Method:                 Least Squares   F-statistic:                     44.56
Date:                Fri, 18 Apr 2025   Prob (F-statistic):           1.62e-09
<<<<<<< HEAD
Time:                        08:17:14   Log-Likelihood:                -2.9309
=======
<<<<<<< HEAD
Time:                        01:19:32   Log-Likelihood:                -2.9309
=======
Time:                        01:30:14   Log-Likelihood:                -2.9309
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d
>>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
No. Observations:                  24   AIC:                             17.86
Df Residuals:                      18   BIC:                             24.93
Df Model:                           5                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const        1.11e-16      0.064   1.72e-15      1.000      -0.135       0.135
총생활인구수         0.2247      0.090      2.484      0.023       0.035       0.415
구별 경찰수         0.4849      0.208      2.328      0.032       0.047       0.922
CCTV 수량        0.1378      0.086      1.609      0.125      -0.042       0.318
총 음식점 수        0.4033      0.149      2.712      0.014       0.091       0.716
파출소수          -0.2671      0.106     -2.509      0.022      -0.491      -0.043
==============================================================================
Omnibus:                        8.993   Durbin-Watson:                   2.176
Prob(Omnibus):                  0.011   Jarque-Bera (JB):                6.911
Skew:                          -1.060   Prob(JB):                       0.0316
Kurtosis:                       4.555   Cond. No.                         6.77
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
<<<<<<< HEAD
=======
  • 아까보다 Adj.R2 도 증가하고, AIC도 감소하고 있습니다.

회귀분석(Stepwise: R2)
<<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d
X2 = X_scaled_df[['총생활인구수', '구별 경찰수','안전벨 개수' ,'CCTV 수량', '총 음식점 수', '1인가구수','파출소수']]
y = X_scaled_df['총범죄건수']
# Adj R2 스코어 함수 정의
def adjusted_r2_score(estimator, X2, y):
    y_pred = estimator.predict(X2)
    n = X2.shape[0]
    p = X2.shape[1]
    r2 = r2_score(y, y_pred)
    adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
    return adjusted_r2


sfs = SFS(lr,
          k_features=(1,7),
          forward=True,
          scoring=adjusted_r2_score,
          cv=0)

sfs.fit(X2, y)


selected_indices_r2 = list(sfs.k_feature_idx_)
names_r2 = np.array(X2.columns)[:-1]

x2 = X_scaled_df[['총생활인구수', '구별 경찰수', '안전벨 개수', 'CCTV 수량', '총 음식점 수', '1인가구수']]
x2 = sm.add_constant(x2)
model2 = sm.OLS(y, x2).fit()
print(model2.summary())
  • 마찬가지로, Stepwise 를 사용하여 R2 기준으로 모델을 생성했습니다.

회귀분석(Stepwise: R2)
<<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  총범죄건수   R-squared:                       0.905
Model:                            OLS   Adj. R-squared:                  0.872
Method:                 Least Squares   F-statistic:                     27.11
Date:                Fri, 18 Apr 2025   Prob (F-statistic):           8.25e-08
<<<<<<< HEAD
Time:                        08:17:14   Log-Likelihood:                -5.7587
=======
<<<<<<< HEAD
Time:                        01:19:32   Log-Likelihood:                -5.7587
=======
Time:                        01:30:14   Log-Likelihood:                -5.7587
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d
>>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
No. Observations:                  24   AIC:                             25.52
Df Residuals:                      17   BIC:                             33.76
Df Model:                           6                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const        1.11e-16      0.075   1.49e-15      1.000      -0.157       0.157
총생활인구수         0.2776      0.110      2.526      0.022       0.046       0.509
구별 경찰수         0.1451      0.198      0.732      0.474      -0.273       0.563
안전벨 개수        -0.0581      0.091     -0.635      0.534      -0.251       0.135
CCTV 수량        0.1921      0.101      1.901      0.074      -0.021       0.405
총 음식점 수        0.5223      0.185      2.831      0.012       0.133       0.912
1인가구수          0.1054      0.105      1.008      0.328      -0.115       0.326
==============================================================================
Omnibus:                        0.222   Durbin-Watson:                   2.051
Prob(Omnibus):                  0.895   Jarque-Bera (JB):                0.228
Skew:                          -0.187   Prob(JB):                        0.892
Kurtosis:                       2.703   Cond. No.                         6.30
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  총범죄건수   R-squared:                       0.903
Model:                            OLS   Adj. R-squared:                  0.876
Method:                 Least Squares   F-statistic:                     33.57
Date:                Fri, 18 Apr 2025   Prob (F-statistic):           1.61e-08
Time:                        08:17:14   Log-Likelihood:                -6.0400
No. Observations:                  24   AIC:                             24.08
Df Residuals:                      18   BIC:                             31.15
Df Model:                           5                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const        1.11e-16      0.073   1.51e-15      1.000      -0.154       0.154
총 음식점 수        0.4745      0.166      2.865      0.010       0.127       0.822
CCTV 수량        0.1789      0.097      1.840      0.082      -0.025       0.383
1인가구수          0.0846      0.098      0.866      0.398      -0.121       0.290
구별 경찰수         0.1832      0.186      0.986      0.337      -0.207       0.574
총생활인구수         0.2817      0.108      2.611      0.018       0.055       0.508
==============================================================================
Omnibus:                        0.922   Durbin-Watson:                   2.122
Prob(Omnibus):                  0.631   Jarque-Bera (JB):                0.287
Skew:                          -0.258   Prob(JB):                        0.867
Kurtosis:                       3.144   Cond. No.                         5.62
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
★모델 1의 AIC: 17.862, 모델 1의 R2: 0.925
모델 2의 AIC: 25.517, 모델 2의 R2: 0.905
모델 3의 AIC: 24.080, 모델 3의 R2: 0.903

최종 모델 검증
<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5

<<<<<<< HEAD
# 잔차정규성
resid_stats, resid_pvalue = stats.shapiro(residuals)
print(resid_pvalue)
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d
# 잔차정규성
resid_stats, resid_pvalue = stats.shapiro(residuals)
print(resid_pvalue)
>>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
0.07179190990614497
  • 유의수준 5% 기각 X (정규성 만족)

최종 모델 검증

최종 모델 검증
<<<<<<< HEAD
#잔차 등분산성
bptest = het_breuschpagan(model1.resid, model1.model.exog)
print(f'BP-test statistics: {bptest[0]:.3f}')
print(f'BP-test p_value: {bptest[1]:.3f}') 
#p-value가 0.3으로 귀무가설 기각하지 못함
#등분산성 만족한다고 볼 수 있음


#잔차 독립성
dw_stat = durbin_watson(model1.resid)
print(f'DW test: {dw_stat:.3f}')  
# 2 정도로 잔차 독립성 만족한다고 볼 수 있음
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d
#잔차 등분산성
bptest = het_breuschpagan(model1.resid, model1.model.exog)
print(f'BP-test statistics: {bptest[0]:.3f}')
print(f'BP-test p_value: {bptest[1]:.3f}') 
#p-value가 0.3으로 귀무가설 기각하지 못함
#등분산성 만족한다고 볼 수 있음


#잔차 독립성
dw_stat = durbin_watson(model1.resid)
print(f'DW test: {dw_stat:.3f}')  
# 2 정도로 잔차 독립성 만족한다고 볼 수 있음
>>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
BP-test statistics: 5.963
BP-test p_value: 0.310
DW test: 2.176
  • 잔차의 등분산성과 독립성도 만족합니다.

최종 모델 해석
<<<<<<< HEAD
======= <<<<<<< HEAD
=======
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d >>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  총범죄건수   R-squared:                       0.925
Model:                            OLS   Adj. R-squared:                  0.904
Method:                 Least Squares   F-statistic:                     44.56
Date:                Fri, 18 Apr 2025   Prob (F-statistic):           1.62e-09
<<<<<<< HEAD
Time:                        08:17:14   Log-Likelihood:                -2.9309
=======
<<<<<<< HEAD
Time:                        01:19:33   Log-Likelihood:                -2.9309
=======
Time:                        01:30:15   Log-Likelihood:                -2.9309
>>>>>>> e1d8c1ba162578a3510e86ec87e8e44bef6a595d
>>>>>>> 65a759e824096aafff283ffb850056ddc07f67b5
No. Observations:                  24   AIC:                             17.86
Df Residuals:                      18   BIC:                             24.93
Df Model:                           5                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const        1.11e-16      0.064   1.72e-15      1.000      -0.135       0.135
총생활인구수         0.2247      0.090      2.484      0.023       0.035       0.415
구별 경찰수         0.4849      0.208      2.328      0.032       0.047       0.922
CCTV 수량        0.1378      0.086      1.609      0.125      -0.042       0.318
총 음식점 수        0.4033      0.149      2.712      0.014       0.091       0.716
파출소수          -0.2671      0.106     -2.509      0.022      -0.491      -0.043
==============================================================================
Omnibus:                        8.993   Durbin-Watson:                   2.176
Prob(Omnibus):                  0.011   Jarque-Bera (JB):                6.911
Skew:                          -1.060   Prob(JB):                       0.0316
Kurtosis:                       4.555   Cond. No.                         6.77
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
총생활인구수
구별 경찰수
총 음식점 수
파출소수
  • 통계적으로 유의함 / CCTV 제외한 변수들도 유의함

CCTV가 많은 구는 범죄수가 적을까?

  • CCTV 수와 범죄건수 간에는 유의미한 관계가 없다고 볼 수 있었다

  • 오히려 총 생활인구수, 경찰 수, 음식점 수, 파출소 수가 범죄건수에 더 큰 영향을 미친다.

서울시 치안 기준 군집화 (보너스)

상관계수가 높은 변수를 활용해서,

비슷한 치안 특성을 가진 구를 찾기위해

저희는 K-Means 클러스터링을 사용했습니다.

군집 개수 2개로 분석 수행
군집1
['강남구' '강서구' '마포구' '서초구' '송파구' '영등포구' '종로구' '중구']
군집2
['강동구' '강북구' '관악구' '광진구' '구로구' '금천구' '노원구' '도봉구' '동대문구' '동작구' '서대문구' '성동구'
 '성북구' '양천구' '용산구' '은평구' '중랑구']

군집 분석으로 알 수 있는 것
군집 총경찰수 파출소수 음식점수 인구수 총범죄수
1 1058.38 7468.25 464,404.93 12.38 9337.38
2 734.65 3824.71 377,246.14 8.41 5867.06
그룹 1 분석
  • 복잡하고 밀도 높음
  • 인구가 많고 상권이 큼
  • 경찰과 파출소 수도 많아 치안 자원이 이미 많이 투입된 상태
  • 그럼에도, 범죄 건수가 높다
그룹 2 분석
  • 그룹 1보다 평균적으로 수치가 낮다
  • 도시 외곽 또는 상대적으로 조용한 주거 지역
  • 인구도 적고 음식점도 적으며, 경찰/파출소 수도 적다.
  • 그에 따라, 범죄 건수도 낮다.

군집간 총 범죄 건수 비교

군집간 총 범죄건수의 평균에 차이가 있다.